package com.blog.service.Impl;
import com.blog.bean.domain.Message;
import com.blog.bean.domain.User;
import com.blog.bean.dto.MessageDTO;
import com.blog.mapper.MessageMapper;
import com.blog.mapper.UserMapper;
import com.blog.service.MessageService;
import com.blog.bean.vo.MessageDetailVO;
import com.blog.bean.vo.MessageListVO;
import com.blog.bean.vo.MessageVO;
import com.blog.bean.vo.SystemMessageVO;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 任浩
 * @version 1.0
 */
@Service
@Slf4j
public class MessageServiceImpl implements MessageService {

    @Autowired
    private MessageMapper messageMapper;
    @Autowired
    private UserMapper userMapper;

    /**
     * @param userId
     * @return
     */
    @Override
    public MessageListVO queryMessage(MessageDTO messageDTO, Integer userId) {
        MessageListVO messageListVO = new MessageListVO();
        //开启分页查询
        PageHelper.startPage(messageDTO.getPage(),messageDTO.getPageNum());
        Page<MessageVO> page = messageMapper.query(userId);

        //得到当前的结果
        List<MessageVO> temList= page.getResult();
        List<MessageVO> list = new ArrayList<>();
        //遍历每一个查询出来的私信，得到私信的用户的信息，和查找一共有多少条聊天记录。
        for (MessageVO messageVO : temList){
            //记录下当前的发布私信的时间，因为下面使用工具类beanutils赋值的时候，因为user的时间属性和信息的时间属性名称一样。
            //下面的会把上面的给覆盖掉。所以要重新设置。
            LocalDateTime createTime = messageVO.getCreateTime(); //当前发送信息的时间。

            if((int)messageVO.getFromId() == (int)(userId)){
                //查找和对方聊天的用户信息.
                User user = new User();
                user.setId(messageVO.getToId());
                User check = userMapper.check(user);
                BeanUtils.copyProperties(check,messageVO);

                //查找当前私聊用户，自己未读对方的信息的数量.
                Integer unreadCount = messageMapper.unreadMsg(messageVO.getToId(),messageVO.getFromId());
                messageVO.setUnreadMessageCount(unreadCount);
            }
            else {
                //查找和对方聊天的用户信息.
                User user = new User();
                user.setId(messageVO.getFromId());
                User check = userMapper.check(user);
                BeanUtils.copyProperties(check,messageVO);

                //查找当前私聊用户，自己未读对方的信息的数量.
                Integer unreadCount = messageMapper.unreadMsg(messageVO.getFromId(),messageVO.getToId());
                messageVO.setUnreadMessageCount(unreadCount);
            }
            //重新设置发送信息的时间。
            messageVO.setCreateTime(createTime);


            //查找和当前用户的聊天的总的消息的数量是多少。
            Integer count = messageMapper.queryCount(messageVO.getFromId(),messageVO.getToId());
            messageVO.setCount(count);
            list.add(messageVO);
        }
        messageListVO.setCurPage(messageDTO.getPage()); //设置当前页面
        messageListVO.setTotal(page.getTotal());  //设置一共有多少条消息
        messageListVO.setData(page.getResult()); //设置查询返回的结果.

        //查询当前用户总的未读的消息数量
        Integer unreadCount = messageMapper.unreadMsg(null, userId);
        System.out.println("未读私信" + unreadCount);
        messageListVO.setUnreadMessageTotal(unreadCount);  //设置当前用户总的未读的消息数量

        return messageListVO;
    }

    /**
     * 查询当前用户的私信的详细信息。
     * @param messageDTO
     * @return
     */
    @Override
    public MessageDetailVO queryDetail(MessageDTO messageDTO, Integer userId) {

        MessageDetailVO messageDetailVO = new MessageDetailVO();
        //开启分页
        PageHelper.startPage(messageDTO.getPage(),messageDTO.getPageNum());
        Page<MessageVO> page =messageMapper.quryDetail(messageDTO.getFromId(),messageDTO.getToId());

        messageDetailVO.setTotal(page.getTotal()); //设置总数据
        messageDetailVO.setCurPage(messageDTO.getPage());
        List<MessageVO> result = page.getResult();//得到的总数据。
        messageDetailVO.setData(result);

        //设置得到用户的信息
        if((int)(userId) != (int)messageDTO.getFromId()){
            User user = new User();
            user.setId(messageDTO.getToId());
            User check = userMapper.check(user);
            messageDetailVO.setOneselfUser(check);
            user.setId(messageDTO.getFromId());
            check = userMapper.check(user);
            messageDetailVO.setOtherUser(check);

            //修改信息的状态为已读
            Message message = new Message();
            message.setFromId(messageDTO.getFromId());
            message.setToId(messageDTO.getToId());
            messageMapper.updateMsgStatus(message);
        }
        else {
            User user = new User();
            user.setId(messageDTO.getFromId());
            User check = userMapper.check(user);
            messageDetailVO.setOneselfUser(check);
            user.setId(messageDTO.getToId());
            check = userMapper.check(user);
            messageDetailVO.setOtherUser(check);
            //修改信息的状态为已读
            Message message = new Message();
            message.setToId(messageDTO.getToId());
            messageMapper.updateMsgStatus(message);
        }
        return messageDetailVO;
    }

    /**
     * 添加私信的方法
     * @param messageDTO
     * @param userId
     */
    @Override
    public void add(MessageDTO messageDTO, Integer userId) {
        //先根据用户名，到用户表查询要私聊用户的信息。
        User user = new User();
        user.setUsername(messageDTO.getUsername());
        User check = userMapper.check(user);

        //设置要添加私信信息的信息。
        Message message = new Message();
        message.setFromId(userId); //设置发送消息的用户id
        message.setToId(check.getId()); //设置发送消息的用户id
        String conversationId = "";
        if((int)userId < (int)check.getId()){
            conversationId = userId + "_" + check.getId();
        }
        else {
            conversationId = check.getId() + "_" + userId;
        }
        message.setConversationId(conversationId); //设置连接的用户id
        message.setContent(messageDTO.getContent());  //设置内容.
        message.setStatus(0); //设置消息为未读
        message.setCreateTime(LocalDateTime.now()); //设置发送消息的时间

        messageMapper.add(message);
    }

    /**
     * 查询系统通知。
     * @param messageDTO
     * @param userId
     * @return
     */
    @Override
    public SystemMessageVO systemMsgList(MessageDTO messageDTO, Integer userId) {
        SystemMessageVO systemMessageVO = new SystemMessageVO();
        Message message = new Message();
        message.setToId(userId);
        message.setFromId(1);

        //先查询系统的点赞的最新的信息。
        message.setConversationId("like");
        MessageVO likeMessageVO = topicNew(message);
        if(likeMessageVO == null){
            likeMessageVO = new MessageVO();
        }
        if(likeMessageVO.getContent() != null){ //把内容进行分割，得到拆分出来的信息，信息为内容和链接id。链接id就是帖子id或者用户id
            String[] split = likeMessageVO.getContent().split(":");
            likeMessageVO.setContent(split[0]);
            likeMessageVO.setLinkData(Integer.parseInt(split[1]));
        }
        Integer count = topicUnreadCount(message);
        likeMessageVO.setUnreadMessageCount(count);  //设置当前主题的未读的数量.
        count = systemMessageTotal(message);
        likeMessageVO.setCount(count);   //设置当前主题的总的数据的数量
        systemMessageVO.setLikeMessageVO(likeMessageVO);

        //先查询系统的评论的最新的信息。
        message.setConversationId("comment");
        MessageVO commentMessageVO = topicNew(message);
        if(commentMessageVO == null){
            commentMessageVO = new MessageVO();
        }
        if(commentMessageVO.getContent() != null){ //把内容进行分割，得到拆分出来的信息，信息为内容和链接id。链接id就是帖子id或者用户id
            String[] split = commentMessageVO.getContent().split(":");
            commentMessageVO.setContent(split[0]);
            commentMessageVO.setLinkData(Integer.parseInt(split[1]));
        }
        count = topicUnreadCount(message);
        commentMessageVO.setUnreadMessageCount(count);  //设置当前主题的未读的数量.
        count = systemMessageTotal(message);
        commentMessageVO.setCount(count);     //设置当前主题的总的数据的数量
        systemMessageVO.setCommentMessageVO(commentMessageVO);

        //查询当前用户系统的关注的最新的信息。
        message.setConversationId("attention");
        MessageVO attentionMessageVO = topicNew(message);
        if(attentionMessageVO == null){
            attentionMessageVO = new MessageVO();
        }
        if(attentionMessageVO.getContent() != null){ //把内容进行分割，得到拆分出来的信息，信息为内容和链接id。链接id就是帖子id或者用户id
            String[] split = attentionMessageVO.getContent().split(":");
            attentionMessageVO.setContent(split[0]);
            attentionMessageVO.setLinkData(Integer.parseInt(split[1]));
        }
        count = topicUnreadCount(message);
        attentionMessageVO.setUnreadMessageCount(count);  //设置当前主题的未读的数量.
        count = topicUnreadCount(message);
        attentionMessageVO.setCount(count);    //设置当前主题的总的数据的数量
        systemMessageVO.setAttentionMessageVO(attentionMessageVO);

        //设置当前总的系统消息的未读数量.
        Integer systemUnReadTotal = likeMessageVO.getUnreadMessageCount() +
                                            commentMessageVO.getUnreadMessageCount()+
                                            attentionMessageVO.getUnreadMessageCount();
        systemMessageVO.setUnreadSystemMessageTotal(systemUnReadTotal);

        //查询当前用户总的私信的未读的消息数量
        Integer unreadCount = messageMapper.unreadMsg(null, userId);
        systemMessageVO.setUnreadMessageTotal(unreadCount);  //设置当前用户总的未读的消息数量
        return systemMessageVO;
    }

    /**
     * 根据系统消息类型，来查询系统消息的最新的消息
     * @param message
     * @return
     */
    public MessageVO topicNew(Message message){
        MessageVO messageVO = messageMapper.topicNew(message);
        return messageVO;
    }

    /**
     * 查询系统消息的当前未读的数量。
     * @param message
     * @return
     */
    public Integer topicUnreadCount(Message message){
        message.setStatus(0);
        Integer count = messageMapper.topicUnreadCount(message);
        return count;
    }

    /**
     * 查询系统消息的分类主题的总的数量。
     * @return
     */
    @Override
    public Integer systemMessageTotal(Message message){
        Integer count = messageMapper.topicUnreadCount(message);
        return count;
    }

    /**
     * 查询某个主题下的所有的信息
     * @param type
     * @param page
     * @param pageNum
     * @param userId
     * @return
     */
    @Override
    public MessageListVO noticeDetailList(Integer type,Integer page,Integer pageNum,Integer userId) {
        MessageListVO messageListVO = new MessageListVO();
        Message message = new Message();
        message.setFromId(1);
        message.setToId(userId);
        if(type == 1){  //查询评论主题的内容
            message.setConversationId("comment");
        }
        else if(type == 2){  //查询点赞主题的内容
            message.setConversationId("like");
        }
        else if(type == 3){   //查询关注主题的内容
            message.setConversationId("attention");
        }

        //开启分页查询。
        PageHelper.startPage(page, pageNum);
        Page<MessageVO> res = messageMapper.noticeDetailList(message);

        User user = new User();
        user.setId(userId);
        User check = userMapper.check(user);
        messageListVO.setUsername(check.getUsername());

        //得到当前的所有的数据
        List<MessageVO> result = res.getResult();
        List<MessageVO> temResult = new ArrayList<>();
        //对查询到的内容进行拆分。
        if(result != null){
            for (MessageVO messageVO : result){
                String[] split = messageVO.getContent().split(":");
                messageVO.setContent(split[0]);
                messageVO.setLinkData(Integer.parseInt(split[1]));
                temResult.add(messageVO);
            }
        }
        messageListVO.setData(temResult);
        //设置当前的分页数据。
        messageListVO.setCurPage(page);
        messageListVO.setTotal(res.getTotal()); //设置当前一共有多少数据

        //查询当前了主题的信息，那么我们就要把查询过的主题信息，设置为已读。
        messageMapper.updateMsgStatus(message);

        return messageListVO;
    }
}
